package com.itheima.dubbo.mongodb.impl;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.commons.pojo.mongo.UserLike;
import com.itheima.dubbo.interfaces.UserLikeApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.util.List;

/**
 * @author yaohu
 * @date 2021/12/13
 * @Version 1.0
 * @describe
 */
@Service
public class UserLikeApiImpl implements UserLikeApi {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 添加右滑喜欢用户
     *
     * @param userLike
     */
    @Override
    public void likeUser(UserLike userLike) {
        mongoTemplate.save(userLike);
    }

    /**
     * 查询互相喜欢数
     *
     * @param userId 用户id
     * @return
     */
    @Override
    public Long queryMutualLikeCount(Long userId) {
        // 1.查询我喜欢人的id集合
        List<UserLike> userLikes = mongoTemplate.find(Query.query(Criteria.where("userId").is(userId)), UserLike.class);
        List<Long> likeUserIds = CollUtil.getFieldValues(userLikes, "likeUserId", Long.class);
        // 2.查询我喜欢人，也喜欢我的人个数
        return mongoTemplate.count(Query.query(Criteria
                .where("likeUserId").is(userId)
                .and("userId").in(likeUserIds)), UserLike.class);
    }

    /**
     * 查询喜欢数
     *
     * @param userId 用户id
     * @return 喜欢数
     */
    @Override
    public Long queryLikeCount(Long userId) {
        return mongoTemplate.count(Query.query(Criteria.where("userId").is(userId)), UserLike.class);
    }

    /**
     * 查询粉丝数
     *
     * @param userId 用户id
     * @return 粉丝数
     */
    @Override
    public Long queryFanCount(Long userId) {
        return mongoTemplate.count(Query.query(Criteria.where("likeUserId").is(userId)), UserLike.class);
    }

    /**
     * 分页查询相互喜欢人的列表
     *
     * @param userId   用户id
     * @param page
     * @param pageSize
     * @return
     */
    @Override
    public List<UserLike> queryMutualLikeList(Long userId, Integer page, Integer pageSize) {
        // 1.查询用户喜欢的人集合
        List<UserLike> userLikes = mongoTemplate.find(Query.query(Criteria.where("userId").is(userId)), UserLike.class);
        // 2.获取用户喜欢的人的id集合
        List<Long> likeUserIds = CollUtil.getFieldValues(userLikes, "likeUserId", Long.class);
        return mongoTemplate.find(Query.query(Criteria.where("userId").in(likeUserIds).and("likeUserId").is(userId))
                .with(Sort.by(Sort.Order.desc("created")))
                .with(PageRequest.of(page - 1, pageSize)), UserLike.class);
    }

    /**
     * 查询用户A是否喜欢B
     *
     * @param userId     A
     * @param likeUserId B
     * @return
     */
    @Override
    public Boolean isAlreadyLove(Long userId, Long likeUserId) {
        UserLike one = mongoTemplate.findOne(Query.query(Criteria.where("userId").is(userId)
                .and("likeUserId").is(likeUserId)), UserLike.class);
        return one != null;
    }

    /**
     * 分页用户查询喜欢人的列表
     *
     * @param userId
     * @param page
     * @param pageSize
     * @return
     */
    @Override
    public List<UserLike> queryLikeList(Long userId, Integer page, Integer pageSize) {
        return mongoTemplate.find(Query.query(Criteria.where("userId").is(userId))
                .with(PageRequest.of(page - 1, pageSize)), UserLike.class);
    }

    /**
     * 分页查询用户粉丝列表
     *
     * @param userId
     * @param page
     * @param pageSize
     * @return
     */
    @Override
    public List<UserLike> queryFanList(Long userId, Integer page, Integer pageSize) {
        return mongoTemplate.find(Query.query(Criteria.where("likeUserId").is(userId)), UserLike.class);
    }

    /**
     * 判断两个用户是否相互喜欢
     *
     * @param userId
     * @param likeUserId
     * @return
     */
    @Override
    public boolean isMutualLike(Long userId, Long likeUserId) {
        return isAlreadyLove(userId, likeUserId) && isAlreadyLove(likeUserId, userId);
    }

    /**
     * 删除喜欢的人
     *
     * @param userId
     * @param likeUserId
     */
    @Override
    public void notLikeUser(Long userId, Long likeUserId) {
        mongoTemplate.remove(Query.query(Criteria.where("userId").is(userId).and("likeUserId").is(likeUserId)), UserLike.class);
    }
}
